//
//  TriangleViewController.m
//  OpenGL_三角形
//
//  Created by user on 2018/10/9.
//  Copyright © 2018年 陈振旭. All rights reserved.
//

#import "TriangleViewController.h"


static GLfloat vertices[] = {
    0.5, -0.5, 0.0f,    1.0f, 0.0f, 0.0f, //右下(x,y,z坐标 + rgb颜色)
    -0.5, 0.5, 0.0f,    0.0f, 1.0f, 0.0f, //左上
    -0.5, -0.5, 0.0f,   0.0f, 0.0f, 1.0f, //左下
//    0.5, 0.5,  0.0f,     1.0f, 1.0f, 0.0f,
};

static GLuint indices[] = {
    0,1,2,
//    1,3,0
};


@interface TriangleViewController ()

@property (nonatomic,strong)EAGLContext *context; //上下文环境
@property (nonatomic,strong)GLKBaseEffect *mEffect;  //着色器效果
@property (nonatomic,assign)int mCount;

@end

@implementation TriangleViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor yellowColor];
    self.mCount = sizeof(indices) / sizeof(indices[0]);
    
    [self setupContext];
    [self setupVBOs];
    [self setupBaseEffect];
}

- (void)setupContext {
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    if (!self.context) {
        NSLog(@"初始化失败");
        exit(1);
    }
    
    GLKView *view = (GLKView *)self.view;
    [view setContext:self.context];
    view.drawableDepthFormat = GLKViewDrawableColorFormatRGBA8888;
    
    if (![EAGLContext setCurrentContext:self.context]) {
        NSLog(@"Failed to set current OpenGL context");
        exit(1);
    }
    
}

- (void)setupVBOs {
    //用于跟踪每个顶点信息的
    GLuint verticesBuffer;
    glGenBuffers(1, &verticesBuffer);//创建一个缓存对象
    glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer);//激活缓冲对象. OpenGL有很多缓冲对象类型，顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER
    /**
     GL_STATIC_DRAW ：数据不会或几乎不会改变。
     GL_DYNAMIC_DRAW：数据会被改变很多。
     GL_STREAM_DRAW ：数据每次绘制时都会改变。
     */
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//调用glBufferData函数，它会把之前定义的顶点数据复制到缓冲的内存中
    
    //用于跟踪组成每个三角形的索引信息
    GLuint indicesBuffer;
    glGenBuffers(1, &indicesBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    
    //开启对应的顶点属性（坐标，纹理坐标，颜色等）
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribColor);
    
    
    /**
     为顶点属性(坐标，纹理坐标，颜色等)配置合适的值
     
     参数1：GLuint indx 声明这个属性的名称
     参数2：GLint size定义这个属性由多少个值组成。譬如说position是由3个GLfloat组成
     参数3: GLenum type声明每一个值是什么类型。我们都用了GL_FLOAT
     参数4：GLboolean normalized , GL_FALSE就好了
     参数5：GLsizei stride stride的大小，描述每个vertex数据的大小
     参数6：const GLvoid* ptr , 数据结构的偏移量。从这个结构中哪里开始获取值。
     
     Position的值在前面，所以传(GLfloat *)NULL + 0进去就可以了。
     而TexCoord是紧接着位置的数据，而position的大小是3个float的大小，所以是从(GLfloat *)NULL + 3开始的
     */
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, (GLfloat *)NULL + 0);
    glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, (GLfloat *)NULL + 3);
    
}

- (void)setupBaseEffect {
    
    self.mEffect = [[GLKBaseEffect alloc] init];
    
}

#pragma mark - GLKViewDelegate
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    
    //启动着色器
    [self.mEffect prepareToDraw];
    
    glClearColor(0.3f, 0.6f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glDrawElements(GL_TRIANGLES, self.mCount, GL_UNSIGNED_INT, 0);
    
}

@end
